var net = require('net');
var netpkg = require('./netpkg');
/**
 * 服务端sever
 */

//记录上一次未完成的数据，即半个包
var last_pkg = null;

var server = net.createServer((client_sock)=>{
    console.log('======createServer=======',client_sock.remoteAddress,client_sock.remotePort);

    client_sock.on('close',function(e){
        console.log('======client_sock err===========',e);
    })
 
    client_sock.on("data", function(data) {
        console.log('=======client_sock=data========',data);

        if(last_pkg !== null){//表示上一次有未完成的数据
            //把上次未完成的包和本次的数据包合并成一个buf
            var buf = Buffer.concat([last_pkg,data],last_pkg.length + data.length);
            last_pkg = buf;
        }else{
            last_pkg = data;
        }

        var offset = 0;
        var pkg_len = netpkg.read_pkg_size(last_pkg, offset);
        if (pkg_len < 0) {
            return;
        }

        console.log('====pkg_len===',pkg_len,last_pkg.length);
        while(offset + pkg_len <= last_pkg.length) { // 判断是否有完整的包;
            // 根据长度信息来读取我们的数据,架设我们穿过来的是文本数据
            // 分配数据的buf内存
            var cmd_buf = Buffer.allocUnsafe(pkg_len - 2); // 2个长度信息
            //从第2个字节开始拷贝数据
            //拷贝的是实时的数据， 不算前面2个字节的包体长度
            last_pkg.copy(cmd_buf, 0, offset + 2, offset + pkg_len);

            console.log("recv Cmd: ", cmd_buf); // cmdbuf ,用户发过来的命令的数据;
            console.log(cmd_buf.toString("utf8"));

            offset += pkg_len;
            if (offset >= last_pkg.length) { // 正好我们的包处理完了;
                break;
            }

            pkg_len = netpkg.read_pkg_size(last_pkg, offset);
            if (pkg_len < 0) {
                break;
            }
        }

        // 能处理的数据包已经处理完成了,保存 0.几个包的数据
        if (offset >= last_pkg.length) {
            last_pkg = null;
        }
        else { // offset, length这段数据拷贝到新的Buffer里面
            //保留无法处理的半个数据包，用于下个消息处理
            var buf = Buffer.allocUnsafe(last_pkg.length - offset);
            last_pkg.copy(buf, 0, offset, last_pkg.length);
            last_pkg = buf;
            console.log('============有半个无法处理===========')
        }
        // end 
    });

    client_sock.on('error',function(err){
        console.log('err',err);
    })
})

server.on('connection',function(){
    console.log('======server=connection========');
});

server.on('listening',function(){
    console.log("start listening...");
});

server.on('close',function(){
    console.log('=====server=close===========');
});

server.on('error',function(err){
    console.log('=====server=error===========',err);
});

server.listen({
	port: 6080,
	host: "127.0.0.1",
	exclusive: true,
});
